package com.反射Reflection.Class类;

import java.lang.reflect.Field;

public class Class_Method常用方法 {
    public static void main(String[] args) throws Exception{
        String classAllPath = "com.反射Reflection.Class类.Cat";

        /// 1.通过类的全路径 反射获取到 Cat类 对应的 Class对象 cls；
        Class<?> cls = Class.forName(classAllPath);

        /// 2.输出cls对象属于的Class类 （一个类只有一个Class类对象）
        System.out.println(cls); ///输出cls 是属于那个类的Class类对象的对象；例如cls是Cat类的Class类对象创建的实例；class com.反射Reflection.Class类.Cat

        ///3.输出cls的运行类型，因为cls是Class类创建的，而Class类是 java.lang.Class
        System.out.println(cls.getClass());  ///java.lang.Class

        ///4.得到包名
        System.out.println(cls.getPackage().getName());  ///Cat类是属于com.反射Reflection.Class类包下的类

        /// 5.得到全类名(全路径)
        System.out.println(cls.getName());///com.反射Reflection.Class类.Cat

        /// 6.通过cls创建对象实例； 得到构造器再创建对象；
       Cat cat = (Cat)cls.getConstructor().newInstance();
        System.out.println(cat); ///cat.toString();
        System.out.println("================================================");

        /// 7.通过反射得到属性 ,也可以通过Field[] fields = cls.getFields();得到属性数组 (非Public会报错)
        Field name = cls.getField("name");
        Field color = cls.getField("color");
        Field price = cls.getField("price");
        System.out.println(name.get(cat));
        System.out.println(color.get(cat));
        System.out.println(price.get(cat));
        name.set(cat,"奶猫");
        System.out.println("反射set修改后name改成了  "+name.get(cat));
        System.out.println("================================================");

        /// 8.得到属性数组 输出属性的名字
        Field[] fields = cls.getFields();
        for (Field field : fields) {
            System.out.println(field.getName());
        }
        System.out.println("================================================");


    }
}
